package com.obligatorio.login;

import java.util.ArrayList;
import java.util.Collection;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.apache.log4j.Logger;

import com.obligatorio.domain.Mensaje;
import com.obligatorio.domain.Usuario;
import com.obligatorio.domain.utils.CryptoUtils;
import com.obligatorio.ejb.ManejadorContactos;
import com.obligatorio.ejb.ManejadorMensaje;
import com.obligatorio.ejb.ManejadorUsuario;

@ManagedBean
@SessionScoped
public class Contactos {

	private static final Logger log = Logger.getLogger(Contactos.class
			.getName());

	@EJB
	private ManejadorContactos mContacto;
	@EJB
	private ManejadorUsuario mUsuario;
	@EJB
	private ManejadorMensaje mMensaje;

	private Usuario contacto;
	private Usuario loggedUsr;

	private Collection<Usuario> todos = new ArrayList<Usuario>();
	private Collection<Usuario> temporales;

	private String nombre;
	private String asunto;
	private String cuerpo;
	private String nota;
	private String invCodigo;
	private boolean invitar = false;
	private String correo;

	@PostConstruct
	public void initialize() {
		try {
			HttpSession session = (HttpSession) FacesContext
					.getCurrentInstance().getExternalContext()
					.getSession(false);
			loggedUsr = (Usuario) session.getAttribute("user");
			// setTodos(mUsuario.buscarUsuariosUsuario(loggedUsr.getEmail()));
			setTodos(mUsuario.buscarUsuariosUsuario(loggedUsr));

		} catch (Exception e) {
			log.error(e.getMessage());
			e.printStackTrace();
		}
	}

	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public Usuario getContacto() {
		return contacto;
	}

	public void setContacto(Usuario contacto) {
		this.contacto = contacto;
	}

	public String getAsunto() {
		return asunto;
	}

	public void setAsunto(String asunto) {
		this.asunto = asunto;
	}

	public String getCuerpo() {
		return cuerpo;
	}

	public void setCuerpo(String cuerpo) {
		this.cuerpo = cuerpo;
	}

	public String getNota() {
		return nota;
	}

	public void setNota(String nota) {
		this.nota = nota;
	}

	public String getCorreo() {
		return correo;
	}

	public void setCorreo(String correo) {
		this.correo = correo;
	}

	public String getInvCodigo() {
		return invCodigo;
	}

	public void setInvCodigo(String invCodigo) {
		this.invCodigo = invCodigo;
	}

	public Collection<Usuario> getTodos() {
		return todos;
	}

	public void setTodos(Collection<Usuario> todos) {
		this.todos = todos;
	}

	public Collection<Usuario> getTemporales() {
		return temporales;
	}

	public void setTemporales(Collection<Usuario> temporales) {
		this.temporales = temporales;
	}

	public void buscarUsuario() {

		Collection<Usuario> tmp = null;
		try {
			tmp = mUsuario.buscarUsuario(nombre);
			setTemporales(tmp);
		} catch (Exception e) {
			log.error(e);
			e.printStackTrace();
		}

	}

	public String eliminarContacto() {
		log.info("*** eliminando contacto *** ");
		String res = "contactos.xhtml?faces-redirect=true";
		try {
			mContacto.eliminarContacto(loggedUsr, contacto);
			log.info("Eliminando : " + contacto);
		} catch (Exception e) {
			log.error(e);
		}
		log.info("*** *** *** *** *** ***");
		return res;
	}

	public String invitar() {
		log.info("*** invitando contacto *** ");
		invitar = true;
		log.info(contacto);
		setAsunto(loggedUsr.toString() + " quiere agregarte a su lista.");
		setCuerpo("Cuerpo del Mensaje de Invitacion");
		setInvCodigo(CryptoUtils.stringValidateAcount());
		setNota("Invitacion:" + invCodigo);
		String res = "enviarMail.xhtml?faces-redirect=true";
		log.info("*** *** *** *** *** ***");
		return res;
	}

	public String contactar() {
		log.info("*** contactando contacto *** ");
		invitar = false;
		log.info(contacto);
		setAsunto("");
		setCuerpo("");
		setNota("Contacto");
		String res = "enviarMail.xhtml?faces-redirect=true";
		log.info("*** *** *** *** *** ***");
		return res;
	}

	public String enviar() {
		log.info("*** Enviado Mensaje Contacto *** ");
		String res = "enviarMail.xhtml?faces-redirect=true";

		if (contacto == null) {
			try {
				contacto = mUsuario.buscarContacto(correo);
			} catch (Exception e) {
				log.error(e.getMessage());
			}
		}

		Mensaje msj = new Mensaje();
		msj.setAsunto(asunto);
		msj.setMensjae(cuerpo);
		msj.setIdUsuarioFrom(loggedUsr);
		msj.setIdUsuarioTo(contacto);
		msj.setBuzon(contacto.getBuzon());
		msj.setNota(nota);

		try {

			if (invitar) {

				if (mMensaje.enviarInvitacion(msj)) {
					log.info("La invitacion a " + contacto.toString()
							+ " ha sido enviada con exito.");
					FacesContext.getCurrentInstance().addMessage(
							null,
							new FacesMessage(FacesMessage.SEVERITY_INFO,
									"La invitacion a " + contacto.toString()
											+ " ha sido enviada con exito.",
									"Informacion"));

					if (nota.length() > 11) {
						mContacto.agregarContacto(loggedUsr, contacto,
								invCodigo);
					}
					clean();
					res = "correoEnviado.xhtml?faces-redirect=true";
				}
			} else {
				if (mMensaje.enviarMensaje(msj)) {
					log.info("El mensaje a " + contacto.toString()
							+ " ha sido enviado con exito.");
					FacesContext.getCurrentInstance().addMessage(
							null,
							new FacesMessage(FacesMessage.SEVERITY_INFO,
									"El mensaje a " + contacto.toString()
											+ " ha sido enviado con exito.",
									"Informacion"));
					clean();
					res = "correoEnviado.xhtml?faces-redirect=true";
				}
			}

		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		log.info("*** *** *** *** *** ***");
		return res;
	}

	private void clean() {

		try {
			setAsunto("");
			setCuerpo("");
			setNombre("");
			setNota("");
			setCorreo("");
			setContacto(null);
			setTemporales(null);
			invitar = false;
			setTodos(mUsuario.buscarUsuariosUsuario(loggedUsr));
		} catch (Exception e) {
			log.error(e);
		}
	}

}
